bitkeeper revision 1.719 (402b68c6wyzlyU0WWpwzC19I8mQBEw)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Thu, 12 Feb 2004 11:51:34 +0000 (11:51 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Thu, 12 Feb 2004 11:51:34 +0000 (11:51 +0000)
Many files:
  Various cleanups to Xen control interfaces.

24 files changed:
tools/examples/xc_dom_control.py
tools/xc/lib/xc.h
tools/xc/lib/xc_bvtsched.c
tools/xc/lib/xc_domain.c
tools/xc/lib/xc_linux_build.c
tools/xc/lib/xc_linux_restore.c
tools/xc/lib/xc_linux_save.c
tools/xc/lib/xc_netbsd_build.c
tools/xc/lib/xc_vbd.c
tools/xc/lib/xc_vif.c
tools/xc/py/Xc.c
tools/xc/py/XenoUtil.py
xen/arch/i386/Rules.mk
xen/common/dom_mem_ops.c
xen/common/memory.c
xen/common/schedule.c
xen/drivers/block/xen_block.c
xen/drivers/block/xen_vbd.c
xen/include/hypervisor-ifs/block.h
xen/include/hypervisor-ifs/vbd.h
xen/include/xeno/vbd.h
xen/net/dev.c
xenolinux-2.4.24-sparse/arch/xeno/drivers/block/xl_block.c
xenolinux-2.4.24-sparse/arch/xeno/drivers/block/xl_vbd.c

index 1f7424d092fd9ce64f94d4533376f7894beb7af3..59d137837e91ba9561a03f738633f080bb81c599 100755 (executable)
@@ -47,7 +47,7 @@ dom = None
 
 
 if len( sys.argv ) > 2 and re.match('\d+$', sys.argv[2]):
-    dom = string.atoi(sys.argv[2])
+    dom = long(sys.argv[2])
 
 if cmd == 'stop':
     rc = xc.domain_stop( dom=dom )
index 11252852c016c65d28e1fbdb0df0a5443d467e4f..5959c6265a2288a6cdcf9dfbb1d4cab92453af7f 100644 (file)
@@ -28,7 +28,7 @@ typedef struct {
     int           has_cpu;
     int           stopped;
     unsigned long nr_pages;
-    unsigned long long cpu_time;
+    u64           cpu_time;
 #define XC_DOMINFO_MAXNAME 16
     char          name[XC_DOMINFO_MAXNAME];
 } xc_dominfo_t;
@@ -86,8 +86,8 @@ typedef struct {
 } xc_vif_sched_params_t;
 
 typedef struct {
-    unsigned long long tx_bytes, tx_pkts;
-    unsigned long long rx_bytes, rx_pkts;
+    u64 tx_bytes, tx_pkts;
+    u64 rx_bytes, rx_pkts;
 } xc_vif_stats_t;
 
 int xc_vif_scheduler_set(int xc_handle,
@@ -109,13 +109,13 @@ typedef struct {
     unsigned short vbdid;
 #define XC_VBDF_WRITEABLE (1<<0)
     unsigned long  flags;
-    unsigned long  nr_sectors;
+    u64            nr_sectors;
 } xc_vbd_t;
 
 typedef struct {
     unsigned short real_device;
-    unsigned long  start_sector;
-    unsigned long  nr_sectors;
+    u64            start_sector;
+    u64            nr_sectors;
 } xc_vbdextent_t;
 
 int xc_vbd_create(int xc_handle,
index 6dc532df1fff2a9b23fe73e9bd5abd31cf5dce9e..57554cd2e64203a73b01cb7d76c1d30b6745342a 100644 (file)
@@ -18,7 +18,7 @@ int xc_bvtsched_global_set(int xc_handle,
 }
 
 int xc_bvtsched_domain_set(int xc_handle,
-                           domid_t domid,
+                           u64 domid,
                            unsigned long mcuadv,
                            unsigned long warp,
                            unsigned long warpl,
@@ -26,7 +26,7 @@ int xc_bvtsched_domain_set(int xc_handle,
 {
     dom0_op_t op;
     op.cmd = DOM0_ADJUSTDOM;
-    op.u.adjustdom.domain  = domid;
+    op.u.adjustdom.domain  = (domid_t)domid;
     op.u.adjustdom.mcu_adv = mcuadv;
     op.u.adjustdom.warp    = warp;
     op.u.adjustdom.warpl   = warpl;
index 669138fd9b2aaced741ec50a5f97b02c055dc1d3..759e3ecfc718a721524f31b50c0d331e05e7a57f 100644 (file)
@@ -11,7 +11,7 @@
 int xc_domain_create(int xc_handle,
                      unsigned int mem_kb, 
                      const char *name,
-                     domid_t *pdomid)
+                     u64 *pdomid)
 {
     int err;
     dom0_op_t op;
@@ -22,71 +22,71 @@ int xc_domain_create(int xc_handle,
     op.u.createdomain.name[MAX_DOMAIN_NAME-1] = '\0';
 
     if ( (err = do_dom0_op(xc_handle, &op)) == 0 )
-        *pdomid = op.u.createdomain.domain;
+        *pdomid = (u64)op.u.createdomain.domain;
 
     return err;
 }    
 
 
 int xc_domain_start(int xc_handle,
-                    domid_t domid)
+                    u64 domid)
 {
     dom0_op_t op;
     op.cmd = DOM0_STARTDOMAIN;
-    op.u.startdomain.domain = domid;
+    op.u.startdomain.domain = (domid_t)domid;
     return do_dom0_op(xc_handle, &op);
 }    
 
 
 int xc_domain_stop(int xc_handle, 
-                   domid_t domid)
+                   u64 domid)
 {
     dom0_op_t op;
     op.cmd = DOM0_STOPDOMAIN;
-    op.u.stopdomain.domain = domid;
+    op.u.stopdomain.domain = (domid_t)domid;
     return do_dom0_op(xc_handle, &op);
 }    
 
 
 int xc_domain_destroy(int xc_handle,
-                      domid_t domid, 
+                      u64 domid, 
                       int force)
 {
     dom0_op_t op;
     op.cmd = DOM0_DESTROYDOMAIN;
-    op.u.destroydomain.domain = domid;
+    op.u.destroydomain.domain = (domid_t)domid;
     op.u.destroydomain.force  = !!force;
     return do_dom0_op(xc_handle, &op);
 }
 
 int xc_domain_pincpu(int xc_handle,
-                     domid_t domid, 
+                     u64 domid, 
                      int cpu)
 {
     dom0_op_t op;
     op.cmd = DOM0_PINCPUDOMAIN;
-    op.u.pincpudomain.domain = domid;
+    op.u.pincpudomain.domain = (domid_t)domid;
     op.u.pincpudomain.cpu  = cpu;
     return do_dom0_op(xc_handle, &op);
 }
 
 
 int xc_domain_getinfo(int xc_handle,
-                      domid_t first_domid,
+                      u64 first_domid,
                       unsigned int max_doms,
                       xc_dominfo_t *info)
 {
     unsigned int nr_doms;
-    domid_t next_domid = first_domid;
+    u64 next_domid = first_domid;
     dom0_op_t op;
 
     for ( nr_doms = 0; nr_doms < max_doms; nr_doms++ )
     {
         op.cmd = DOM0_GETDOMAININFO;
-        op.u.getdomaininfo.domain = next_domid;
+        op.u.getdomaininfo.domain = (domid_t)next_domid;
         if ( do_dom0_op(xc_handle, &op) < 0 )
             break;
-        info->domid   = op.u.getdomaininfo.domain;
+        info->domid   = (u64)op.u.getdomaininfo.domain;
         info->cpu     = op.u.getdomaininfo.processor;
         info->has_cpu = op.u.getdomaininfo.has_cpu;
         info->stopped = (op.u.getdomaininfo.state == DOMSTATE_STOPPED);
@@ -95,7 +95,7 @@ int xc_domain_getinfo(int xc_handle,
         strncpy(info->name, op.u.getdomaininfo.name, XC_DOMINFO_MAXNAME);
         info->name[XC_DOMINFO_MAXNAME-1] = '\0';
 
-        next_domid = op.u.getdomaininfo.domain + 1;
+        next_domid = (u64)op.u.getdomaininfo.domain + 1;
         info++;
     }
 
index 0071ddf94d525c893c8628b42a91f18825c04cde..2ea7d00096748fe28afc4102a5ea364ec594ebef 100644 (file)
 #define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED)
 #define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
 
-static long get_tot_pages(int xc_handle, domid_t domid)
+static long get_tot_pages(int xc_handle, u64 domid)
 {
     dom0_op_t op;
     op.cmd = DOM0_GETDOMAININFO;
-    op.u.getdomaininfo.domain = domid;
+    op.u.getdomaininfo.domain = (domid_t)domid;
     return (do_dom0_op(xc_handle, &op) < 0) ? 
         -1 : op.u.getdomaininfo.tot_pages;
 }
 
 static int get_pfn_list(int xc_handle,
-                        domid_t domid, 
+                        u64 domid, 
                         unsigned long *pfn_buf, 
                         unsigned long max_pfns)
 {
     dom0_op_t op;
     int ret;
     op.cmd = DOM0_GETMEMLIST;
-    op.u.getmemlist.domain   = domid;
+    op.u.getmemlist.domain   = (domid_t)domid;
     op.u.getmemlist.max_pfns = max_pfns;
     op.u.getmemlist.buffer   = pfn_buf;
 
@@ -96,7 +96,7 @@ static int copy_to_domain_page(int pm_handle,
 }
 
 static int setup_guestos(int xc_handle,
-                         domid_t dom, 
+                         u64 dom, 
                          gzFile kernel_gfd, 
                          gzFile initrd_gfd, 
                          unsigned long tot_pages,
@@ -312,7 +312,7 @@ static int setup_guestos(int xc_handle,
 }
 
 int xc_linux_build(int xc_handle,
-                   domid_t domid,
+                   u64 domid,
                    const char *image_name,
                    const char *ramdisk_name,
                    const char *cmdline)
@@ -382,9 +382,9 @@ int xc_linux_build(int xc_handle,
     }
 
     op.cmd = DOM0_GETDOMAININFO;
-    op.u.getdomaininfo.domain = domid;
+    op.u.getdomaininfo.domain = (domid_t)domid;
     if ( (do_dom0_op(xc_handle, &op) < 0) || 
-         (op.u.getdomaininfo.domain != domid) )
+         ((u64)op.u.getdomaininfo.domain != domid) )
     {
         PERROR("Could not get info on domain");
         goto error_out;
@@ -468,7 +468,7 @@ int xc_linux_build(int xc_handle,
     ctxt->failsafe_callback_cs  = FLAT_RING1_CS;
     ctxt->failsafe_callback_eip = 0;
 
-    launch_op.u.builddomain.domain   = domid;
+    launch_op.u.builddomain.domain   = (domid_t)domid;
     launch_op.u.builddomain.num_vifs = 1;
 
     launch_op.cmd = DOM0_BUILDDOMAIN;
index 7afb239d91fee6299ea6ae450d44e6f622a96c2c..be65a9e36737ee3729bd75329dfc8a6d115c89ec 100644 (file)
     } while ( 0 )
 
 static int get_pfn_list(int xc_handle,
-                        domid_t domain_id, 
+                        u64 domain_id, 
                         unsigned long *pfn_buf, 
                         unsigned long max_pfns)
 {
     dom0_op_t op;
     int ret;
     op.cmd = DOM0_GETMEMLIST;
-    op.u.getmemlist.domain   = domain_id;
+    op.u.getmemlist.domain   = (domid_t)domain_id;
     op.u.getmemlist.max_pfns = max_pfns;
     op.u.getmemlist.buffer   = pfn_buf;
 
@@ -104,12 +104,12 @@ static int checked_read(gzFile fd, void *buf, size_t count)
 int xc_linux_restore(int xc_handle,
                      const char *state_file,
                      int verbose,
-                     domid_t *pdomid)
+                     u64 *pdomid)
 {
     dom0_op_t op;
     int rc = 1, i, j;
     unsigned long mfn, pfn;
-    domid_t dom = 0;
+    u64 dom = 0ULL;
     unsigned int prev_pc, this_pc;
     
     /* Number of page frames in use by this XenoLinux session. */
@@ -225,11 +225,11 @@ int xc_linux_restore(int xc_handle,
         ERROR("Could not create new domain");
         goto out;
     }
-    dom = op.u.createdomain.domain;
+    dom = (u64)op.u.createdomain.domain;
 
     /* Get the domain's shared-info frame. */
     op.cmd = DOM0_GETDOMAININFO;
-    op.u.getdomaininfo.domain = dom;
+    op.u.getdomaininfo.domain = (domid_t)dom;
     if ( do_dom0_op(xc_handle, &op) < 0 )
     {
         ERROR("Could not get information on new domain");
@@ -452,7 +452,7 @@ int xc_linux_restore(int xc_handle,
     }
 
     op.cmd = DOM0_BUILDDOMAIN;
-    op.u.builddomain.domain   = dom;
+    op.u.builddomain.domain   = (domid_t)dom;
     op.u.builddomain.num_vifs = 1;
     memcpy(&op.u.builddomain.ctxt, &ctxt, sizeof(ctxt));
     rc = do_dom0_op(xc_handle, &op);
@@ -463,7 +463,7 @@ int xc_linux_restore(int xc_handle,
         if ( dom != 0 )
         {
             op.cmd = DOM0_DESTROYDOMAIN;
-            op.u.destroydomain.domain = dom;
+            op.u.destroydomain.domain = (domid_t)dom;
             op.u.destroydomain.force  = 1;
             (void)do_dom0_op(xc_handle, &op);
         }
index 62c4d379dda0d847c24544199ace5b8e0a66b131..40fc06acd5f71eb2cfc8dfad6c6297fb8d7224b1 100644 (file)
 
 static int check_pfn_ownership(int xc_handle, 
                                unsigned long mfn, 
-                               domid_t dom)
+                               u64 dom)
 {
     dom0_op_t op;
     op.cmd = DOM0_GETPAGEFRAMEINFO;
     op.u.getpageframeinfo.pfn    = mfn;
-    op.u.getpageframeinfo.domain = dom;
+    op.u.getpageframeinfo.domain = (domid_t)dom;
     return (do_dom0_op(xc_handle, &op) >= 0);
 }
 
 #define GETPFN_ERR (~0U)
 static unsigned int get_pfn_type(int xc_handle, 
                                  unsigned long mfn, 
-                                 domid_t dom)
+                                 u64 dom)
 {
     dom0_op_t op;
     op.cmd = DOM0_GETPAGEFRAMEINFO;
     op.u.getpageframeinfo.pfn    = mfn;
-    op.u.getpageframeinfo.domain = dom;
+    op.u.getpageframeinfo.domain = (domid_t)dom;
     if ( do_dom0_op(xc_handle, &op) < 0 )
     {
         PERROR("Unexpected failure when getting page frame info!");
@@ -75,7 +75,7 @@ static int checked_write(gzFile fd, void *buf, size_t count)
 }
 
 int xc_linux_save(int xc_handle,
-                  domid_t domid, 
+                  u64 domid, 
                   const char *state_file, 
                   int verbose)
 {
@@ -142,9 +142,9 @@ int xc_linux_save(int xc_handle,
     for ( ; ; )
     {
         op.cmd = DOM0_GETDOMAININFO;
-        op.u.getdomaininfo.domain = domid;
+        op.u.getdomaininfo.domain = (domid_t)domid;
         if ( (do_dom0_op(xc_handle, &op) < 0) || 
-             (op.u.getdomaininfo.domain != domid) )
+             ((u64)op.u.getdomaininfo.domain != domid) )
         {
             PERROR("Could not get info on domain");
             goto out;
@@ -160,7 +160,7 @@ int xc_linux_save(int xc_handle,
         we_stopped_it = 1;
 
         op.cmd = DOM0_STOPDOMAIN;
-        op.u.stopdomain.domain = domid;
+        op.u.stopdomain.domain = (domid_t)domid;
         if ( do_dom0_op(xc_handle, &op) != 0 )
         {
             we_stopped_it = 0;
@@ -375,7 +375,7 @@ int xc_linux_save(int xc_handle,
     if ( we_stopped_it )
     {
         op.cmd = DOM0_STARTDOMAIN;
-        op.u.startdomain.domain = domid;
+        op.u.startdomain.domain = (domid_t)domid;
         (void)do_dom0_op(xc_handle, &op);
     }
 
index 4da93b702366a86d895a2e15a06479ef64a8175e..64ba336efc1a13e2ea063f7527745c7ac659077f 100644 (file)
@@ -22,24 +22,24 @@ static int loadelfimage(gzFile, int, unsigned long *, unsigned long,
 #define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED)
 #define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
 
-static long get_tot_pages(int xc_handle, domid_t domid)
+static long get_tot_pages(int xc_handle, u64 domid)
 {
     dom0_op_t op;
     op.cmd = DOM0_GETDOMAININFO;
-    op.u.getdomaininfo.domain = domid;
+    op.u.getdomaininfo.domain = (domid_t)domid;
     return (do_dom0_op(xc_handle, &op) < 0) ? 
         -1 : op.u.getdomaininfo.tot_pages;
 }
 
 static int get_pfn_list(int xc_handle,
-                        domid_t domid, 
+                        u64 domid, 
                         unsigned long *pfn_buf, 
                         unsigned long max_pfns)
 {
     dom0_op_t op;
     int ret;
     op.cmd = DOM0_GETMEMLIST;
-    op.u.getmemlist.domain   = domid;
+    op.u.getmemlist.domain   = (domid_t)domid;
     op.u.getmemlist.max_pfns = max_pfns;
     op.u.getmemlist.buffer   = pfn_buf;
 
@@ -75,7 +75,7 @@ static int send_pgupdates(int xc_handle, mmu_update_t *updates, int nr_updates)
 }
 
 static int setup_guestos(int xc_handle,
-                         domid_t dom, 
+                         u64 dom, 
                          gzFile kernel_gfd, 
                          unsigned long tot_pages,
                          unsigned long *virt_startinfo_addr, 
@@ -248,7 +248,7 @@ static int setup_guestos(int xc_handle,
 }
 
 int xc_netbsd_build(int xc_handle,
-                    domid_t domid,
+                    u64 domid,
                     const char *image_name,
                     const char *cmdline)
 {
@@ -282,9 +282,9 @@ int xc_netbsd_build(int xc_handle,
     }
 
     op.cmd = DOM0_GETDOMAININFO;
-    op.u.getdomaininfo.domain = domid;
+    op.u.getdomaininfo.domain = (domid_t)domid;
     if ( (do_dom0_op(xc_handle, &op) < 0) || 
-         (op.u.getdomaininfo.domain != domid) )
+         ((u64)op.u.getdomaininfo.domain != domid) )
     {
         PERROR("Could not get info on domain");
         goto error_out;
@@ -364,7 +364,7 @@ int xc_netbsd_build(int xc_handle,
     ctxt->failsafe_callback_cs  = FLAT_RING1_CS;
     ctxt->failsafe_callback_eip = 0;
 
-    launch_op.u.builddomain.domain   = domid;
+    launch_op.u.builddomain.domain   = (domid_t)domid;
     launch_op.u.builddomain.num_vifs = 1;
 
     launch_op.cmd = DOM0_BUILDDOMAIN;
index 76a0e6814dd681becf916e166d9faf6da7c71dd4..00d166d03de72d56ed016c051ec3e8f2e49c6aaf 100644 (file)
 #include "xc_private.h"
 
 int xc_vbd_create(int xc_handle,
-                  domid_t domid, 
+                  u64 domid, 
                   unsigned short vbdid, 
                   int writeable)
 {
     block_io_op_t op; 
     op.cmd = BLOCK_IO_OP_VBD_CREATE; 
-    op.u.create_params.domain  = domid;
+    op.u.create_params.domain  = (domid_t)domid;
     op.u.create_params.vdevice = vbdid;
     op.u.create_params.mode    = VBD_MODE_R | (writeable ? VBD_MODE_W : 0);
     return do_block_io_op(xc_handle, &op);
@@ -24,47 +24,47 @@ int xc_vbd_create(int xc_handle,
 
 
 int xc_vbd_destroy(int xc_handle,
-                   domid_t domid, 
+                   u64 domid, 
                    unsigned short vbdid)
 {
     block_io_op_t op; 
     op.cmd = BLOCK_IO_OP_VBD_DELETE; 
-    op.u.delete_params.domain  = domid;
+    op.u.delete_params.domain  = (domid_t)domid;
     op.u.delete_params.vdevice = vbdid;
     return do_block_io_op(xc_handle, &op);
 }
 
 
 int xc_vbd_grow(int xc_handle,
-                domid_t domid, 
+                u64 domid, 
                 unsigned short vbdid,
                 xc_vbdextent_t *extent)
 {
     block_io_op_t op; 
     op.cmd = BLOCK_IO_OP_VBD_GROW; 
-    op.u.grow_params.domain  = domid; 
+    op.u.grow_params.domain  = (domid_t)domid; 
     op.u.grow_params.vdevice = vbdid;
     op.u.grow_params.extent.device       = extent->real_device; 
-    op.u.grow_params.extent.start_sector = extent->start_sector;
-    op.u.grow_params.extent.nr_sectors   = extent->nr_sectors;
+    op.u.grow_params.extent.start_sector = (xen_sector_t)extent->start_sector;
+    op.u.grow_params.extent.nr_sectors   = (xen_sector_t)extent->nr_sectors;
     return do_block_io_op(xc_handle, &op);
 }
 
 
 int xc_vbd_shrink(int xc_handle,
-                  domid_t domid, 
+                  u64 domid, 
                   unsigned short vbdid)
 {
     block_io_op_t op; 
     op.cmd = BLOCK_IO_OP_VBD_SHRINK; 
-    op.u.shrink_params.domain  = domid; 
+    op.u.shrink_params.domain  = (domid_t)domid; 
     op.u.shrink_params.vdevice = vbdid;
     return do_block_io_op(xc_handle, &op);
 }
 
 
 int xc_vbd_setextents(int xc_handle,
-                      domid_t domid, 
+                      u64 domid, 
                       unsigned short vbdid,
                       unsigned int nr_extents,
                       xc_vbdextent_t *extents)
@@ -87,13 +87,15 @@ int xc_vbd_setextents(int xc_handle,
         for ( i = 0; i < nr_extents; i++ )
         {
             real_extents[i].device       = extents[i].real_device;
-            real_extents[i].start_sector = extents[i].start_sector;
-            real_extents[i].nr_sectors   = extents[i].nr_sectors;
+            real_extents[i].start_sector = 
+                (xen_sector_t)extents[i].start_sector;
+            real_extents[i].nr_sectors   = 
+                (xen_sector_t)extents[i].nr_sectors;
         }
     }
 
     op.cmd = BLOCK_IO_OP_VBD_SET_EXTENTS;
-    op.u.setextents_params.domain     = domid;
+    op.u.setextents_params.domain     = (domid_t)domid;
     op.u.setextents_params.vdevice    = vbdid;
     op.u.setextents_params.nr_extents = nr_extents;
     op.u.setextents_params.extents    = real_extents;
@@ -110,7 +112,7 @@ int xc_vbd_setextents(int xc_handle,
 
 
 int xc_vbd_getextents(int xc_handle,
-                      domid_t domid, 
+                      u64 domid, 
                       unsigned short vbdid,
                       unsigned int max_extents,
                       xc_vbdextent_t *extents,
@@ -129,7 +131,7 @@ int xc_vbd_getextents(int xc_handle,
     }
 
     op.cmd = BLOCK_IO_OP_VBD_INFO;
-    op.u.info_params.domain     = domid;
+    op.u.info_params.domain     = (domid_t)domid;
     op.u.info_params.vdevice    = vbdid;
     op.u.info_params.maxextents = max_extents;
     op.u.info_params.extents    = real_extents;
@@ -142,8 +144,8 @@ int xc_vbd_getextents(int xc_handle,
         for ( i = 0; i < op.u.info_params.nextents; i++ )
         {
             extents[i].real_device  = real_extents[i].device;
-            extents[i].start_sector = real_extents[i].start_sector;
-            extents[i].nr_sectors   = real_extents[i].nr_sectors;
+            extents[i].start_sector = (u64)real_extents[i].start_sector;
+            extents[i].nr_sectors   = (u64)real_extents[i].nr_sectors;
         }
 
         if ( writeable != NULL )
@@ -159,7 +161,7 @@ int xc_vbd_getextents(int xc_handle,
 
 
 int xc_vbd_probe(int xc_handle,
-                 domid_t domid,
+                 u64 domid,
                  unsigned int max_vbds,
                  xc_vbd_t *vbds)
 {
@@ -168,7 +170,7 @@ int xc_vbd_probe(int xc_handle,
     int i, j, ret, allocsz = max_vbds * sizeof(xen_disk_t); 
 
     op.cmd = BLOCK_IO_OP_VBD_PROBE; 
-    op.u.probe_params.domain = domid; 
+    op.u.probe_params.domain = (domid_t)domid; 
     
     xdi->max   = max_vbds;
     xdi->disks = malloc(allocsz);
@@ -192,11 +194,11 @@ int xc_vbd_probe(int xc_handle,
             if ( !(xdi->disks[i].info & XD_FLAG_VIRT) )
                 continue;
             
-            vbds[j].domid = xdi->disks[i].domain;
+            vbds[j].domid = (u64)xdi->disks[i].domain;
             vbds[j].vbdid = xdi->disks[i].device;
             vbds[j].flags = (xdi->disks[i].info & XD_FLAG_RO) ? 
                 0 : XC_VBDF_WRITEABLE;
-            vbds[j].nr_sectors = xdi->disks[i].capacity;
+            vbds[j].nr_sectors = (u64)xdi->disks[i].capacity;
             
             j++;
         }
index c73e2dde72634d8f0f32b36d1a951ddbbab34ea1..518abfa0e394244e91cb85cc0429b6eb4c9e17d8 100644 (file)
@@ -9,13 +9,13 @@
 #include "xc_private.h"
 
 int xc_vif_scheduler_set(int xc_handle,
-                         domid_t domid, 
+                         u64 domid, 
                          unsigned int vifid, 
                          xc_vif_sched_params_t *params)
 {
     network_op_t  netop;
     netop.cmd = NETWORK_OP_VIFSETPARAMS;
-    netop.u.vif_setparams.domain       = domid;
+    netop.u.vif_setparams.domain       = (domid_t)domid;
     netop.u.vif_setparams.vif          = vifid;
     netop.u.vif_setparams.credit_bytes = params->credit_bytes;
     netop.u.vif_setparams.credit_usec  = params->credit_usec;
@@ -24,7 +24,7 @@ int xc_vif_scheduler_set(int xc_handle,
 
 
 int xc_vif_scheduler_get(int xc_handle,
-                         domid_t domid, 
+                         u64 domid, 
                          unsigned int vifid, 
                          xc_vif_sched_params_t *params)
 {
@@ -32,7 +32,7 @@ int xc_vif_scheduler_get(int xc_handle,
     int rc;
 
     netop.cmd = NETWORK_OP_VIFGETINFO;
-    netop.u.vif_getinfo.domain = domid;
+    netop.u.vif_getinfo.domain = (domid_t)domid;
     netop.u.vif_getinfo.vif    = vifid;
 
     if ( (rc = do_network_op(xc_handle, &netop)) >= 0 )
@@ -46,7 +46,7 @@ int xc_vif_scheduler_get(int xc_handle,
 
 
 int xc_vif_stats_get(int xc_handle,
-                     domid_t domid, 
+                     u64 domid, 
                      unsigned int vifid, 
                      xc_vif_stats_t *stats)
 {
@@ -54,7 +54,7 @@ int xc_vif_stats_get(int xc_handle,
     int rc;
 
     netop.cmd = NETWORK_OP_VIFGETINFO;
-    netop.u.vif_getinfo.domain = domid;
+    netop.u.vif_getinfo.domain = (domid_t)domid;
     netop.u.vif_getinfo.vif    = vifid;
 
     if ( (rc = do_network_op(xc_handle, &netop)) >= 0 )
index 8e3f5f7dcbdefadc28a4dc896c9330808ebd416c..a483581e5efa19dcbb52122136c93440ee2e23a8 100644 (file)
@@ -432,7 +432,7 @@ static PyObject *pyxc_vbd_grow(PyObject *self,
     static char *kwd_list[] = { "dom", "vbd", "device", 
                                 "start_sector", "nr_sectors", NULL };
 
-    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "Liill", kwd_list, 
+    if ( !PyArg_ParseTupleAndKeywords(args, kwds, "LiiLL", kwd_list, 
                                       &dom, &vbd, 
                                       &extent.real_device, 
                                       &extent.start_sector, 
@@ -502,13 +502,13 @@ static PyObject *pyxc_vbd_setextents(PyObject *self,
                 goto fail;
             extents[i].real_device = (unsigned short)PyInt_AsLong(obj);
             if ( ((obj = PyDict_GetItemString(dict,"start_sector")) == NULL) ||
-                 !PyInt_Check(obj) )
+                 !PyLong_Check(obj) )
                 goto fail;
-            extents[i].start_sector = PyInt_AsLong(obj);
+            extents[i].start_sector = PyLong_AsUnsignedLongLong(obj);
             if ( ((obj = PyDict_GetItemString(dict, "nr_sectors")) == NULL) ||
-                 !PyInt_Check(obj) )
+                 !PyLong_Check(obj) )
                 goto fail;
-            extents[i].nr_sectors = PyInt_AsLong(obj);        
+            extents[i].nr_sectors = PyLong_AsUnsignedLongLong(obj);        
         }
     }
 
@@ -564,7 +564,7 @@ static PyObject *pyxc_vbd_getextents(PyObject *self,
         {
             PyList_SetItem(
                 list, i, 
-                Py_BuildValue("{s:i,s:l,s:l}",
+                Py_BuildValue("{s:i,s:L,s:L}",
                               "device",       extents[i].real_device,
                               "start_sector", extents[i].start_sector,
                               "nr_sectors",   extents[i].nr_sectors));
@@ -606,7 +606,7 @@ static PyObject *pyxc_vbd_probe(PyObject *self,
     {
         PyList_SetItem(
             list, i, 
-            Py_BuildValue("{s:L,s:i,s:i,s:l}",
+            Py_BuildValue("{s:L,s:i,s:i,s:L}",
                           "dom",        info[i].domid,
                           "vbd",        info[i].vbdid,
                           "writeable",  !!(info[i].flags & XC_VBDF_WRITEABLE),
@@ -806,8 +806,8 @@ static PyMethodDef pyxc_methods[] = {
       " dom          [long]: Identifier of domain containing the VBD.\n"
       " vbd          [int]:  Identifier of the VBD.\n"
       " device       [int]:  Identifier of the real underlying block device.\n"
-      " start_sector [int]:  Real start sector of this extent.\n"
-      " nr_sectors   [int]:  Length, in sectors, of this extent.\n\n"
+      " start_sector [long]: Real start sector of this extent.\n"
+      " nr_sectors   [long]: Length, in sectors, of this extent.\n\n"
       "Returns: [int] 0 on success; -1 on error.\n" },
 
     { "vbd_shrink", 
@@ -825,9 +825,9 @@ static PyMethodDef pyxc_methods[] = {
       " dom          [long]: Identifier of domain containing the VBD.\n"
       " vbd          [int]:  Identifier of the VBD.\n"
       " extents      [list of dicts]: Per-extent information.\n"
-      "  device       [int]: Identifier of the real underlying block device.\n"
-      "  start_sector [int]: Real start sector of this extent.\n"
-      "  nr_sectors   [int]: Length, in sectors, of this extent.\n\n"
+      "  device       [int]:  Id of the real underlying block device.\n"
+      "  start_sector [long]: Real start sector of this extent.\n"
+      "  nr_sectors   [long]: Length, in sectors, of this extent.\n\n"
       "Returns: [int] 0 on success; -1 on error.\n" },
 
     { "vbd_getextents", 
@@ -837,9 +837,9 @@ static PyMethodDef pyxc_methods[] = {
       " dom          [long]: Identifier of domain containing the VBD.\n"
       " vbd          [int]:  Identifier of the VBD.\n\n"
       "Returns: [list of dicts] per-extent information; empty on error.\n"
-      " device       [int]: Identifier of the real underlying block device.\n"
-      " start_sector [int]: Real start sector of this extent.\n"
-      " nr_sectors   [int]: Length, in sectors, of this extent.\n" },
+      " device       [int]:  Identifier of the real underlying block device.\n"
+      " start_sector [long]: Real start sector of this extent.\n"
+      " nr_sectors   [long]: Length, in sectors, of this extent.\n" },
 
     { "vbd_probe", 
       (PyCFunction)pyxc_vbd_probe, 
@@ -852,7 +852,7 @@ static PyMethodDef pyxc_methods[] = {
       " dom        [long]: Domain containing this VBD.\n"
       " vbd        [int]:  Domain-specific identifier of this VBD.\n"
       " writeable  [int]:  Bool - is this VBD writeable?\n"
-      " nr_sectors [int]:  Size of this VBD, in 512-byte sectors.\n" },
+      " nr_sectors [long]: Size of this VBD, in 512-byte sectors.\n" },
 
     { "readconsolering", 
       (PyCFunction)pyxc_readconsolering, 
index 043d7782d1441e16e0d67dff92bff76d2528d3bd..68f4f02f54f85008e9dd018dd4c935507c213a8a 100644 (file)
@@ -133,8 +133,8 @@ def lookup_raw_partn(partition):
     nr_sectors, type }
         device:       Device number of the given partition
         start_sector: Index of first sector of the partition
-        nr_sectsors:  Number of sectors comprising this partition
-        type:       'Disk' or identifying name for partition type
+        nr_sectors:   Number of sectors comprising this partition
+        type:         'Disk' or identifying name for partition type
     """
 
     if not re.match( '/dev/', partition ):
@@ -147,8 +147,8 @@ def lookup_raw_partn(partition):
         line = fd.readline()
         if line:
             return [ { 'device' : blkdev_name_to_number(drive),
-                       'start_sector' : 0,
-                       'nr_sectors' : int(line) * 2,
+                       'start_sector' : long(0),
+                       'nr_sectors' : long(line) * 2,
                        'type' : 'Disk' } ]
         return None
 
@@ -162,8 +162,8 @@ def lookup_raw_partn(partition):
                        'size=\s*([0-9]+), Id=\s*(\S+).*$', line)
         if m:
             return [ { 'device' : blkdev_name_to_number(drive),
-                       'start_sector' : int(m.group(1)),
-                       'nr_sectors' : int(m.group(2)),
+                       'start_sector' : long(m.group(1)),
+                       'nr_sectors' : long(m.group(2)),
                        'type' : m.group(3) } ]
     
     return None
@@ -421,7 +421,7 @@ def vd_lookup(id):
                  # the disk device this extent is on - for passing to Xen
                  'device' : lookup_raw_partn(partition)[0]['device'],
                  # the offset of this extent within the disk - for passing to Xen
-                 'start_sector' : int(part_offset + lookup_raw_partn(partition)[0]['start_sector']),
+                 'start_sector' : long(part_offset + lookup_raw_partn(partition)[0]['start_sector']),
                  # extent size, in sectors
                  'nr_sectors' : nr_sectors,
                  # partition device this extent is on (useful to know for XenoUtil fns)
index 56f5932b6d58f1b74db1c2892c663c21f956a783..7adf28664d92b694119b6ab805b72eab0cfa10ad 100644 (file)
@@ -9,8 +9,8 @@ MONITOR_BASE := 0xFC500000
 LOAD_BASE    := 0x00100000
 CFLAGS  := -nostdinc -fno-builtin -fno-common -fno-strict-aliasing 
 CFLAGS  += -iwithprefix include -O3 -Wall -DMONITOR_BASE=$(MONITOR_BASE)
-CFLAGS  += -fomit-frame-pointer -I$(BASEDIR)/include -D__KERNEL__ -DNDEBUG
-#CFLAGS  += -fomit-frame-pointer -I$(BASEDIR)/include -D__KERNEL__
+#CFLAGS  += -fomit-frame-pointer -I$(BASEDIR)/include -D__KERNEL__ -DNDEBUG
+CFLAGS  += -fomit-frame-pointer -I$(BASEDIR)/include -D__KERNEL__
 CFLAGS  += -Wno-pointer-arith -Wredundant-decls
 LDFLAGS := -T xeno.lds -N
 
index 53facf8477ee5080198076ed2c59c5b69c7da3da..97b0f784e667279f5b5185a3cae7bf01482dd9ee 100644 (file)
@@ -62,7 +62,7 @@ static long free_dom_mem(struct task_struct *p, reservation_decrease_t op)
         op.pages++;
         if ( mpfn >= max_page )
         {
-            DPRINTK("Domain %d page number out of range (%08lx>=%08lx)\n", 
+            DPRINTK("Domain %llu page number out of range (%08lx>=%08lx)\n", 
                     p->domain, mpfn, max_page);
             rc = -EINVAL;
             goto out;
@@ -71,7 +71,7 @@ static long free_dom_mem(struct task_struct *p, reservation_decrease_t op)
         page = &frame_table[mpfn];
         if ( unlikely(!get_page(page, p)) )
         {
-            DPRINTK("Bad page free for domain %d\n", p->domain);
+            DPRINTK("Bad page free for domain %llu\n", p->domain);
             rc = -EINVAL;
             goto out;
         }
index 1f952c8b2747d6f7e7fc113c15f7db28bceff720..cd643b26869b4454239cbe360f50805257c8d42d 100644 (file)
 
 #ifndef NDEBUG
 #define MEM_LOG(_f, _a...)                           \
-  printk("DOM%d: (file=memory.c, line=%d) " _f "\n", \
+  printk("DOM%llu: (file=memory.c, line=%d) " _f "\n", \
          current->domain, __LINE__, ## _a )
 #else
 #define MEM_LOG(_f, _a...) ((void)0)
index 122915f145583436ce28fc513123cb16b027d39d..e6450cc54c0cf942bf3fa8d057761aabd11b44de 100644 (file)
@@ -260,7 +260,7 @@ long do_sched_op(unsigned long op)
 
     case SCHEDOP_exit:
     {
-        DPRINTK("DOM%d killed itself!\n", current->domain);
+        DPRINTK("DOM%llu killed itself!\n", current->domain);
         DPRINTK(" EIP == %08lx\n", get_execution_context()->eip);
         kill_domain();
         break;
@@ -268,7 +268,7 @@ long do_sched_op(unsigned long op)
 
     case SCHEDOP_stop:
     {
-        DPRINTK("DOM%d stopped itself!\n", current->domain);
+        DPRINTK("DOM%llu stopped itself!\n", current->domain);
         DPRINTK(" EIP == %08lx\n", get_execution_context()->eip);
         stop_domain();
         break;
index 4f0888a185d7bf82c1bbc92bb1385e4b8c6e699e..937086a6a048f96196041c33e6f7f82fb0505363 100644 (file)
@@ -452,7 +452,7 @@ static void dispatch_rw_block_io(struct task_struct *p,
        new_segs = vbd_translate(&phys_seg[nr_psegs], p, operation);
        if ( new_segs < 0 )
         { 
-            DPRINTK("access denied: %s of [%ld,%ld] on dev=%04x\n", 
+            DPRINTK("access denied: %s of [%llu,%llu] on dev=%04x\n", 
                     operation == READ ? "read" : "write", 
                     req->sector_number + tot_sects, 
                     req->sector_number + tot_sects + nr_sects, 
@@ -498,7 +498,7 @@ static void dispatch_rw_block_io(struct task_struct *p,
     
         bh->b_size          = phys_seg[i].nr_sects << 9;
         bh->b_dev           = phys_seg[i].dev;
-        bh->b_rsector       = phys_seg[i].sector_number;
+        bh->b_rsector       = (unsigned long)phys_seg[i].sector_number;
         bh->b_data          = phys_to_virt(phys_seg[i].buffer);
         bh->b_end_io        = end_block_io_op;
         bh->pending_req     = pending_req;
index 8a42026dacfee00f79bb4643035b159126a3a13b..3e25440e52db56f7dea6f7d6e9fada8d35ceb2e8 100644 (file)
@@ -88,7 +88,7 @@ long vbd_create(vbd_create_t *create)
 
     if ( unlikely((p = find_domain_by_id(create->domain)) == NULL) )
     {
-        DPRINTK("vbd_create attempted for non-existent domain %d\n", 
+        DPRINTK("vbd_create attempted for non-existent domain %llu\n", 
                 create->domain); 
         return -EINVAL; 
     }
@@ -170,7 +170,7 @@ long vbd_grow(vbd_grow_t *grow)
 
     if ( unlikely((p = find_domain_by_id(grow->domain)) == NULL) )
     {
-        DPRINTK("vbd_grow: attempted for non-existent domain %d\n", 
+        DPRINTK("vbd_grow: attempted for non-existent domain %llu\n", 
                 grow->domain); 
         return -EINVAL; 
     }
@@ -197,7 +197,7 @@ long vbd_shrink(vbd_shrink_t *shrink)
 
     if ( (p = find_domain_by_id(shrink->domain)) == NULL )
     {
-        DPRINTK("vbd_shrink attempted for non-existent domain %d\n", 
+        DPRINTK("vbd_shrink attempted for non-existent domain %llu\n", 
                 shrink->domain); 
         return -EINVAL; 
     }
@@ -259,7 +259,7 @@ long vbd_setextents(vbd_setextents_t *setextents)
 
     if ( (p = find_domain_by_id(setextents->domain)) == NULL )
     {
-        DPRINTK("vbd_setextents attempted for non-existent domain %d\n", 
+        DPRINTK("vbd_setextents attempted for non-existent domain %llu\n", 
                 setextents->domain); 
         return -EINVAL; 
     }
@@ -355,7 +355,7 @@ long vbd_delete(vbd_delete_t *delete)
 
     if ( (p = find_domain_by_id(delete->domain)) == NULL )
     {
-        DPRINTK("vbd_delete attempted for non-existent domain %d\n", 
+        DPRINTK("vbd_delete attempted for non-existent domain %llu\n", 
                 delete->domain); 
         return -EINVAL; 
     }
@@ -450,7 +450,7 @@ static int vbd_probe_single(xen_disk_info_t *xdi,
     cur_disk.info   = vbd->type;
     if ( !VBD_CAN_WRITE(vbd) )
         cur_disk.info |= XD_FLAG_RO; 
-    cur_disk.capacity = 0 ; 
+    cur_disk.capacity = 0ULL;
     for ( x = vbd->extents; x != NULL; x = x->next )
         cur_disk.capacity += x->extent.nr_sectors; 
     cur_disk.domain = p->domain; 
@@ -542,7 +542,7 @@ long vbd_probe(vbd_probe_t *probe)
         if ( (probe->domain != VBD_PROBE_ALL) &&
              ((p = find_domain_by_id(probe->domain)) == NULL) )
         {
-            DPRINTK("vbd_probe attempted for non-existent domain %d\n", 
+            DPRINTK("vbd_probe attempted for non-existent domain %llu\n", 
                     probe->domain); 
             return -EINVAL; 
         }
@@ -597,7 +597,7 @@ long vbd_info(vbd_info_t *info)
 
     if ( (p = find_domain_by_id(info->domain)) == NULL )
     {
-        DPRINTK("vbd_info attempted for non-existent domain %d\n", 
+        DPRINTK("vbd_info attempted for non-existent domain %llu\n", 
                 info->domain); 
         return -EINVAL; 
     }
@@ -653,7 +653,8 @@ int vbd_translate(phys_seg_t *pseg, struct task_struct *p, int operation)
     xen_extent_le_t *x; 
     vbd_t *vbd;
     rb_node_t *rb;
-    unsigned long sec_off, nr_secs;
+    xen_sector_t sec_off;
+    unsigned long nr_secs;
 
     spin_lock(&p->vbd_lock);
 
@@ -669,7 +670,7 @@ int vbd_translate(phys_seg_t *pseg, struct task_struct *p, int operation)
             goto found;
     }
 
-    DPRINTK("vbd_translate; domain %d attempted to access "
+    DPRINTK("vbd_translate; domain %llu attempted to access "
             "non-existent VBD.\n", p->domain); 
 
     spin_unlock(&p->vbd_lock);
index 515d8ad3383b24fe08492e52ae42fcaf4464ed6e..da5f38ee67f69deab8ab02caa33a50ac08397b43 100644 (file)
@@ -8,6 +8,8 @@
 #ifndef __BLOCK_H__
 #define __BLOCK_H__
 
+typedef u64 xen_sector_t;
+
 /*
  *
  * These are the ring data structures for buffering messages between 
 /*
  * Maximum scatter/gather segments per request.
  * This is carefully chosen so that sizeof(blk_ring_t) <= PAGE_SIZE.
+ * NB. This could be 12 if the ring indexes weren't stored in the same page.
  */
-#define MAX_BLK_SEGS 12
+#define MAX_BLK_SEGS 11
 
 typedef struct blk_ring_req_entry 
 {
     unsigned long  id;                     /* private guest os value       */
-    unsigned long  sector_number;          /* start sector idx on disk     */
     unsigned short device;                 /* XENDEV_??? + idx             */
     unsigned char  operation;              /* XEN_BLOCK_???                */
     unsigned char  nr_segments;            /* number of segments           */
+    xen_sector_t   sector_number;          /* start sector idx on disk     */
     /* Least 9 bits is 'nr_sects'. High 23 bits are the address.           */
     unsigned long  buffer_and_sects[MAX_BLK_SEGS];
 } blk_ring_req_entry_t;
@@ -97,7 +100,7 @@ typedef struct xen_disk
 {
     unsigned short device;       /* device number (opaque 16 bit val)  */
     unsigned short info;         /* device type and flags              */
-    unsigned long  capacity;     /* size in terms of #512 byte sectors */
+    xen_sector_t   capacity;     /* size in terms of #512 byte sectors */
     domid_t        domain;       /* if a VBD, domain this 'belongs to' */
 } xen_disk_t;
 
index a16d1253dee0d6a5939afaca05aeb65cdfa011b4..adf24e968294cddb72e8882c1fe20e2d1d5766f2 100644 (file)
 #define BLOCK_IO_OP_VBD_INFO     9    /* query info about a particular VBD */
 
 typedef struct _xen_extent { 
-    u16       device; 
-    u16       unused;
-    ulong     start_sector; 
-    ulong     nr_sectors;
+    u16          device; 
+    u16          unused;
+    xen_sector_t start_sector; 
+    xen_sector_t nr_sectors;
 } xen_extent_t; 
 
 #define VBD_MODE_R         0x1
index 6f1b6a04e50d6d6a7841be86b25895045bb1eba4..3c6a2de88df207ea7009cde0aa7f65fd00411bf3 100644 (file)
@@ -57,8 +57,8 @@ void destroy_all_vbds(struct task_struct *p);
 typedef struct {
     unsigned short dev;
     unsigned short nr_sects;
-    unsigned long  sector_number;
     unsigned long  buffer;
+    xen_sector_t   sector_number;
 } phys_seg_t;
 
 
index 48c7a582952bfbc94767c864dbf2fb2f843f265e..afa85895ec11a78924cbf9c30b5abaf6926f1f52 100644 (file)
@@ -2064,7 +2064,7 @@ static void get_rx_bufs(net_vif_t *vif)
         if ( unlikely(pte_pfn >= max_page) ||
              unlikely(!get_page_and_type(pte_page, p, PGT_l1_page_table)) )
         {
-            DPRINTK("Bad page frame for ppte %d,%08lx,%08lx,%08lx\n",
+            DPRINTK("Bad page frame for ppte %llu,%08lx,%08lx,%08lx\n",
                     p->domain, pte_pfn, max_page, pte_page->type_and_flags);
             make_rx_response(vif, rx.id, 0, RING_STATUS_BAD_PAGE, 0);
             continue;
index 4be2f56e6ad99d55589c8e11160a0595561a3e69..2f6bfe5fd4b427bb5d275548ff21539fcca7a2ab 100644 (file)
@@ -366,7 +366,7 @@ static int hypervisor_request(unsigned long   id,
     req = &blk_ring->ring[MASK_BLK_IDX(req_prod)].req;
     req->id            = id;
     req->operation     = operation;
-    req->sector_number = sector_number;
+    req->sector_number = (xen_sector_t)sector_number;
     req->device        = device; 
     req->nr_segments   = 1;
     req->buffer_and_sects[0] = buffer_ma | nr_sectors;
index 77a3f0e40196604483fccffce4ea17490bcb17e3..61f232acb94288ea01f01765e3b7988a515a21d3 100644 (file)
@@ -102,6 +102,7 @@ static int xlvbd_init_device(xen_disk_t *xd)
     struct block_device *bd;
     xl_disk_t *disk;
     int i, rc = 0, max_part, partno;
+    unsigned long capacity;
 
     unsigned char buf[64];
 
@@ -237,6 +238,9 @@ static int xlvbd_init_device(xen_disk_t *xd)
 
     gd->flags[minor >> gd->minor_shift] |= GENHD_FL_XENO;
         
+    /* NB. Linux 2.4 only handles 32-bit sector offsets and capacities. */
+    capacity = (unsigned long)xd->capacity;
+
     if ( partno != 0 )
     {
         /*
@@ -268,15 +272,15 @@ static int xlvbd_init_device(xen_disk_t *xd)
 
         /* Need to skankily setup 'partition' information */
         gd->part[minor].start_sect = 0; 
-        gd->part[minor].nr_sects   = xd->capacity; 
-        gd->sizes[minor]           = xd->capacity; 
+        gd->part[minor].nr_sects   = capacity; 
+        gd->sizes[minor]           = capacity; 
 
         gd->flags[minor >> gd->minor_shift] |= GENHD_FL_VIRT_PARTNS;
     }
     else
     {
-        gd->part[minor].nr_sects = xd->capacity;
-        gd->sizes[minor] = xd->capacity>>(BLOCK_SIZE_BITS-9);
+        gd->part[minor].nr_sects = capacity;
+        gd->sizes[minor] = capacity>>(BLOCK_SIZE_BITS-9);
         
         /* Some final fix-ups depending on the device type */
         switch ( XD_TYPE(xd->info) )
@@ -301,8 +305,7 @@ static int xlvbd_init_device(xen_disk_t *xd)
                        disk_name(gd, MINOR(device), buf));
                 break;
             }
-            register_disk(gd, device, gd->max_p, &xlvbd_block_fops, 
-                          xd->capacity);            
+            register_disk(gd, device, gd->max_p, &xlvbd_block_fops, capacity);
             break; 
 
         default: